/* 
    scan 其实就是Observable 版本的reduce 只是命名不同。如果熟悉数组操作的话，
    应该会知道原生的JS Array 就有reduce 的方法，使用方式如下
*/

const arr = [1, 2, 3, 4];
const result = arr.reduce((origin, next) => { 
    console.log(origin)
    return origin + next
}, 0);

console.log(result)

/* 
    scan 整体的运作方式都跟reduce 一样，范例如下
*/

const source = Rx.Observable.from('hello')
             .zip(Rx.Observable.interval(600), (x, y) => x);

const example = source.scan((origin, next) => origin + next, '');

example.subscribe({
    next: (value) => { console.log(value); },
    error: (err) => { console.log('Error: ' + err); },
    complete: () => { console.log('complete'); }
});
// h
// he
// hel
// hell
// hello
// complete

/* 
    source : ----h----e----l----l----o|
    scan((origin, next) => origin + next, '')
    example: ----h----(he)----(hel)----(hell)----(hello)|
*/